// 导入类型定义
import { PerformanceInfo, SDKConfig } from '../types'; // 导入性能信息和SDK配置类型
import { getPerformanceMetrics, shouldSample } from '../utils'; // 导入性能指标采集和采样判断工具

// 性能监控器类，负责采集和处理页面性能数据
export class PerformanceMonitor {
  private config: SDKConfig; // SDK配置
  private performanceHandler: (performance: PerformanceInfo) => void; // 性能数据处理回调
  private isInitialized = false; // 是否已初始化

  // 构造函数，传入配置和回调
  constructor(config: SDKConfig, performanceHandler: (performance: PerformanceInfo) => void) {
    this.config = config; // 保存配置
    this.performanceHandler = performanceHandler; // 保存回调
  }

  // 初始化性能监控
  public init(): void {
    if (this.isInitialized) {
      return; // 已初始化则直接返回
    }
    this.isInitialized = true; // 标记为已初始化
    // 监听页面加载完成
    if (document.readyState === 'loading') {
      document.addEventListener('DOMContentLoaded', () => {
        this.collectPerformanceData(); // DOM加载完成时采集
      });
    } else {
      this.collectPerformanceData(); // 已加载则直接采集
    }
    // 监听页面完全加载
    window.addEventListener('load', () => {
      this.collectPerformanceData(); // 页面load时采集
    });
    // 监听页面可见性变化
    document.addEventListener('visibilitychange', () => {
      if (document.visibilityState === 'visible') {
        this.collectPerformanceData(); // 页面变为可见时采集
      }
    });
  }

  // 采集性能数据
  private collectPerformanceData(): void {
    if (!shouldSample(this.config.sampleRate)) {
      return; // 不采样则返回
    }
    const metrics = getPerformanceMetrics(); // 获取性能指标
    if (metrics.loadTime || metrics.domContentLoadedTime) {
      const performanceInfo: PerformanceInfo = {
        loadTime: metrics.loadTime || 0, // 页面加载时间
        domContentLoadedTime: metrics.domContentLoadedTime || 0, // DOM加载时间
        fcp: metrics.fcp, // 首次内容绘制
        lcp: metrics.lcp, // 最大内容绘制
        fid: metrics.fid, // 首次输入延迟
        cls: metrics.cls, // 累积布局偏移
        timestamp: Date.now() // 时间戳
      };
      this.performanceHandler(performanceInfo); // 上报性能数据
    }
  }

  // 手动上报性能信息
  public reportPerformance(performance: PerformanceInfo): void {
    if (!shouldSample(this.config.sampleRate)) {
      return; // 不采样则返回
    }
    this.performanceHandler(performance); // 上报性能数据
  }

  // 获取当前性能指标
  public getCurrentPerformance(): Partial<PerformanceInfo> {
    return getPerformanceMetrics(); // 返回当前性能指标
  }

  // 销毁性能监控器，移除所有监听
  public destroy(): void {
    this.isInitialized = false; // 标记为未初始化
    document.removeEventListener('DOMContentLoaded', this.collectPerformanceData); // 移除DOM加载监听
    window.removeEventListener('load', this.collectPerformanceData); // 移除load监听
    document.removeEventListener('visibilitychange', this.collectPerformanceData); // 移除可见性监听
  }
} 